#include "bqueue.hpp"
//display result
std::vector<int>p_put;
std::vector<int>c_get;
const int times=1000;//the running times
//pthread func
void* producerFunc(void* argv){
    // usleep(1000);
    bqueue<int>*bq=static_cast<bqueue<int>*>(argv);
    for(int i = 0;i < times;i++){
        bq->put(i);
        // printf("PRODUCER:block_queue has %ld elements.they are: ",bq.size());
        // for(auto el:bq)printf("%d ",el);
        // printf("\n"); 
        p_put.push_back(i);
    }
    return nullptr;
}
void* consumerFunc(void* argv){
    bqueue<int>*bq=static_cast<bqueue<int>*>(argv);
    for(int i=0;i<times;i++){
        c_get.push_back(bq->get());
        // std::cout<<"CONSUMER:block_queue has "<<bq.size()<<" elements.they are: ";
        // for(auto el:bq)std::cout<<el<<' ';
        // std::cout<<std::endl;
    }
    return nullptr;
}
const int pthread_cnt=2;
int main(){
    //init
    bqueue<int>* bq = new bqueue<int>(100);//blockqueue
    // for(int i = 0;i < 3;i++){
        // printf("PRODUCER:block_queue has %ld elements.they are: ",bq.size());
        // for(auto el:bq)printf("%d ",el);
        // printf("\n"); 
    //     p_put.push_back(i);
    //     bq->put(i);
    // }
    
    std::ios::sync_with_stdio(false);
    
    // // 构建生产和消费者
    // pthread_t c[2], p[3];

    // pthread_create(c, nullptr, consumerFunc, bq);
    // pthread_create(c+1, nullptr, consumerFunc, bq);
    // pthread_create(p, nullptr, producerFunc, bq);
    // pthread_create(p+1, nullptr, producerFunc, bq);

    // pthread_create(p+2, nullptr, producerFunc, bq);
    // pthread_join(c[0], nullptr);
    // pthread_join(c[1], nullptr);
    // pthread_join(p[0], nullptr);
    // pthread_join(p[1], nullptr);
    // pthread_join(p[2], nullptr);
    int cnt=pthread_cnt;
    pthread_t producers[cnt];
    for(int i=0;i<cnt;i++)
        pthread_create(&producers[i],nullptr,producerFunc,(void*)bq);
    pthread_t consumers[cnt];
    for(int i=0;i<cnt;i++)
        pthread_create(&consumers[i],nullptr,consumerFunc,(void*)bq);

    //end
    for(int i=0;i<cnt;i++)
        pthread_detach(producers[i]);
    for(int i=0;i<cnt;i++)
        pthread_detach(consumers[i]);
    sleep(10000);
    // for(int i=0;i<cnt;i++)
    //     pthread_join(producers[i],nullptr);
    // for(int i=0;i<cnt;i++)
    //     pthread_join(consumers[i],nullptr);
    // // display
    // printf("DISPLAY:\n");
    // printf("PRODUCER:");
    // for(auto el:p_put){
    //     std::cout<<el<<' ';
    // }
    // std::cout<<std::endl;    
    // printf("CONSUMER:");
    // for(auto el:c_get){
    //     std::cout<<el<<' ';
    // }
    // std::cout<<std::endl;
    delete bq;
    return 0;
}